package com.app.utils.task;

import com.app.utils.base.j2se.Common;
import com.app.utils.base.j2se.Logger;
import com.app.utils.base.j2se.MapHandler;
import com.app.utils.redis.Redis;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Configuration;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Description
 * Created by 王伟
 * Date create on 14:15 2019/12/11.
 */
@Configuration
@AutoConfigureAfter(Redis.class)
public class TaskLoader implements Job {

	private DateFormat day = new SimpleDateFormat("yyyyMMdd");
	private DateFormat second = new SimpleDateFormat("HHmmss");
	/**
	 * 执行具体任务
	 */
	@Override
	public void execute(JobExecutionContext jbContext) throws JobExecutionException {
		try {
			//获得任务名称
			String jobName = jbContext.getJobDetail().getKey().getName();
			//如果已经不在当前任务map中
			if(!TaskSetup.tasking.containsKey(jobName)){
				Logger.error(String.format("任务加载器发现执行任务已移除.param:%s",MapHandler.initMap("jobName", jobName)),new RuntimeException("任务加载器发现执行任务已移除"));
				return;
			}
			//判断任务组类型
			Task task = TaskSetup.tasking.get(jobName);
			//如果是单机执行 判断是否可以执行
			if("single".equals(task.getJobGroup())){
				//任务名+精确到秒的时间
				Date date = jbContext.getScheduledFireTime();
				//如果不行执行
				if(Common.isNotEmpty(Redis.hash)){
					if(!task.single(day.format(date), second.format(date))){
						Logger.info(String.format("执行单机任务发现不是第一个请求任务的服务器.%s :%s", jobName, task.getDesc()));
						return;
					}
				}else {
					Logger.info("执行任务时发现找不到Redis连接");
					return;
				}
			}
			//通过限制 执行任务
			boolean success = false;
			long beginTime = System.currentTimeMillis();
			try {
				Logger.info("loc:JOB-%s", jobName);
				task.getJob().execute(jbContext);
				success = true;
			} catch (Exception e) {
				Logger.error(String.format("任务加载器执行任务.param:%s",MapHandler.initMap("jobName", jobName)),e);
			}
			long endTime = System.currentTimeMillis();
			Logger.info("loc:JOB-%s，time:%s,status:%s", jobName,(int)(endTime-beginTime),success?"success":"error");
		} catch (Exception e) {
			Logger.error(String.format("任务加载器执行任务.param:%s",MapHandler.initMap("jobName", jbContext.getJobDetail().getKey().getName())),e);
		}
	}

}
